package com.filldream.fastboot.common.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.util.Collections;

/**
 * 对象返回类
 * @author RickSun
 * @see 3.0
 * 2019-03-22 15:56
 */
@Data
public class R<T> extends B {

	/** 返回对象  */
	private T data;

	/** 对象校验  */
	@JsonIgnore
	private Boolean checkOk;

	/**
	 * 空参构造器
	 */
	public R(){}

	/**
	 * 全参构造器
	 * @param code
	 * @param msg
	 * @param enmsg
	 * @param data
	 */
	public R(int code, String msg, String enmsg, T data){
		this.code=code;
		this.msg=msg;
		this.enmsg =enmsg;
		this.data = data;
		this.checkOk = null;
	}

	/**
	 * 全参构造器
	 * @param code
	 * @param msg
	 * @param enmsg
	 * @param data
	 * @param checkOk
	 */
	public R(int code, String msg, String enmsg, T data, Boolean checkOk){
		this.code=code;
		this.msg=msg;
		this.enmsg =enmsg;
		this.data = data;
		this.checkOk = checkOk;
	}

	/**
	 * 默认返回错误码
	 * @param errContent	错误码
	 * @param isList	是否是列表 true-列表 false-对象
	 * @return
	 */
	public static R createError(ErrContent errContent, Boolean isList){
		return new R(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg()
				,(isList == false || isList == null) ? Collections.EMPTY_MAP : Collections.EMPTY_LIST);
	}

	/**
	 * 默认返回错误码
	 * @param errContent
	 * @return
	 */
	public static R createError(ErrContent errContent){
		return createError(errContent,true);
	}

	/**
	 * 默认返回错误码
	 * @param errContent	错误码
	 * @param isList	是否是列表 true-列表 false-对象
	 * @param checkOk	是否是成功的
	 * @return
	 */
	public static R createError(ErrContent errContent, Boolean isList, Boolean checkOk){
		return new R(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg()
				,(isList == false || isList == null) ? Collections.EMPTY_MAP : Collections.EMPTY_LIST,checkOk);
	}

	/**
	 * 默认失败
	 * @return
	 */
	public static R fail(){
		ErrorCode errorCode = ErrorCode.FAIL;
		return createError(errorCode.reMsg(),false);
	}

	/**
	 * 默认失败
	 * @return
	 */
	public static R fail(String msg){
		ErrorCode errorCode = ErrorCode.FAIL;
		return new R(errorCode.getCode(),msg,errorCode.getEnMsg(),Collections.EMPTY_MAP);
	}

	/**
	 * 自定义1
	 * @param errorCode	错误码
	 * @param msg	返回信息
	 * @return
	 */
	public static <T> R<T> diy(ErrorCode errorCode, String msg){
		return new R(errorCode.getCode(),msg,errorCode.getEnMsg(),Collections.EMPTY_MAP);
	}

	/**
	 * 自定义2
	 * @param errContent	错误码
	 * @param data	返回对象
	 * @param <T>
	 * @return
	 */
	public static <T> R<T> diy(ErrContent errContent, T data){
		return new R(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg(),data);
	}

	/**
	 * @author RickSun
	 * @Description 自定义3
	 **/
	public static <T> R<T> diy(ErrContent errContent, T data,String msg){
		return new R(errContent.getCode(),msg,errContent.getEnMsg(),data);
	}

	//---------成功--------

	/**
	 * 默认成功
	 * @param errContent
	 * @param data
	 * @param <T>
	 * @return
	 */
	public static <T> R successd(ErrContent errContent, T data){
		return new R<T>(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg(),data);
	}

	/**
	 * 默认成功
	 * @param data 返回对象
	 * @return
	 */
	public static <T> R<T> successd(T data){
		ErrorCode errorCode = ErrorCode.SUCCESS;
		if(data == null){
			return createError(ErrorCode.EMPTY_RESULT.reMsg(),false,false);
		}
		return successd(errorCode.reMsg(),data);
	}

	/**
	 * 自动判断是否成功
	 * @param data	对象
	 * @param <T>
	 * @return
	 */
	public static <T> R<T> autoSuccess(T data){
		return data == null ? R.fail() : successd(ErrorCode.SUCCESS.reMsg(),data);
	}

	//---------默认为空--------

	/**
	 * 默认为空
	 * @param isList	是否是列表
	 * @return
	 */
	public static R empty(Boolean isList){
		return createError(ErrorCode.EMPTY_RESULT.reMsg(),false,isList);
	}

	/**
	 * 默认为空对象
	 * @return
	 */
	public static R empty(){
		return empty(false);
	}

	/**
	 * 默认为列表
	 * @return
	 */
	public static R emptyList(){
		return empty(true);
	}

	@Override
	public R put(String key, Object value) {
		checkMap();
		this.otherMap.put(key,value);
		return this;
	}

	@JsonIgnore
	@Override
	public boolean isOk(){
		return this.code == ErrorCode.SUCCESS.getCode() && (this.checkOk == null || this.checkOk);
	}

}